/*-------------------------------------------------------------------------
 *
 * pwritev.c
 *	  对于缺乏该功能的平台实现 pwritev(2)。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 *
 * IDENTIFICATION
 *	  src/port/pwritev.c
 *
 * 请注意，此实现会更改当前文件位置，不同于 POSIX 风格函数，因此我们使用 pg_pwritev()。
 *
 *-------------------------------------------------------------------------
 */


#include "c.h"

#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif

#include "port/pg_iovec.h"

ssize_t pg_pwritev(int fc_fd, const struct iovec *fc_iov, int fc_iovcnt, off_t fc_offset)
{
#ifdef HAVE_WRITEV
	if (fc_iovcnt == 1)
		return pg_pwrite(fc_fd, fc_iov[0].iov_base, fc_iov[0].iov_len, fc_offset);
	if (lseek(fc_fd, fc_offset, SEEK_SET) < 0)
		return -1;
	return writev(fc_fd, fc_iov, fc_iovcnt);
#else
	ssize_t		fc_sum = 0;
	ssize_t		fc_part;

	for (int fc_i = 0; fc_i < iovcnt; ++fc_i)
	{
		fc_part = pg_pwrite(fd, iov[fc_i].iov_base, iov[fc_i].iov_len, offset);
		if (fc_part < 0)
		{
			if (fc_i == 0)
				return -1;
			else
				return fc_sum;
		}
		fc_sum += fc_part;
		offset += fc_part;
		if (fc_part < iov[fc_i].iov_len)
			return fc_sum;
	}
	return fc_sum;
#endif
}
